package com.khtec.tools.parsetool.common;

/**
 * 报文处理工具类
 */
public class MessageUtil {

    /**
     * 根据是否需要计算报文头和报文头长度，将提供的报文拼接为带有报文头的报文
     *
     * @param message 报文内容
     * @param needHeader 是否需要计算报文头长度
     * @param headerLength 报文头长度
     * @return 带有报文头的完整报文
     */
    public static String buildMessage(String message, boolean needHeader, int headerLength) {

        if (headerLength <= 0) {
            throw new IllegalArgumentException("报文头长度必须大于0");
        }
        // 计算报文长度（字节长度）
        int messageLength = message.getBytes().length;
        //判断是否添加报文头长度
        if (needHeader) {
            messageLength += headerLength;
        }
        // 将长度转换为左补零的字符串
        String header = String.format("%0" + headerLength + "d", messageLength);
        
        // 拼接报文头和报文内容
        return header + message;
    }

    /**
     * 从带有报文头的报文中解析出原始报文
     *
     * @param fullMessage 带有报文头的完整报文
     * @param headerLength 报文头长度
     * @return 原始报文内容
     */
    public static String parseMessage(String fullMessage, int headerLength) {
        if (fullMessage == null || fullMessage.length() <= headerLength) {
            throw new IllegalArgumentException("报文格式不正确");
        }

        // 提取报文头（长度信息）
        String header = fullMessage.substring(0, headerLength);
        
        // 解析报文长度
        int messageLength;
        try {
            messageLength = Integer.parseInt(header);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("报文头格式不正确，无法解析为数字");
        }
        
        // 提取报文内容
        String message = fullMessage.substring(headerLength);
        
        // 验证报文长度是否匹配
        if (message.getBytes().length != messageLength) {
            throw new IllegalArgumentException("报文长度与报文头声明的长度不匹配");
        }
        
        return message;
    }
}
